/*
 * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package java.lang;
import java.lang.ref.*;

/**
 * 此类扩展 <tt>ThreadLocal</tt> 以提供从父线程到子线程的值继承：
 * 当创建子线程时，子线程接收父线程具有值的所有可继承线程局部变量的初始值。
 * 通常子线程的值将与父线程的值相同；但是，通过重写此类中的 <tt>childValue</tt>
 * 方法，可以使子线程的值成为父线程值的任意函数。
 *
 * <p>当变量中维护的每线程属性（例如，用户 ID、事务 ID）必须自动传输到
 * 创建的任何子线程时，优先使用可继承线程局部变量而不是普通线程局部变量。
 *
 * @author  Josh Bloch and Doug Lea
 * @see     ThreadLocal
 * @since   1.2
 */

public class InheritableThreadLocal<T> extends ThreadLocal<T> {
    /**
     * 在创建子线程时，根据父线程的值计算此可继承线程局部变量的子线程初始值。
     * 此方法在子线程启动之前从父线程内调用。
     * <p>
     * 此方法仅返回其输入参数，如果需要不同的行为，应该重写此方法。
     *
     * @param parentValue 父线程的值
     * @return 子线程的初始值
     */
    protected T childValue(T parentValue) {
        return parentValue;
    }

    /**
     * 获取与 ThreadLocal 关联的映射。
     *
     * @param t 当前线程
     */
    ThreadLocalMap getMap(Thread t) {
       return t.inheritableThreadLocals;
    }

    /**
     * 创建与 ThreadLocal 关联的映射。
     *
     * @param t 当前线程
     * @param firstValue 表的初始条目的值。
     */
    void createMap(Thread t, T firstValue) {
        t.inheritableThreadLocals = new ThreadLocalMap(this, firstValue);
    }
}
